use std::sync::{Arc, Mutex};

// 模块声明
mod websocket;
mod storage;
mod chat;
mod group;
// mod file_dialog; // Tauri 2.0 的 dialog API 直接在前端使用，不需要 Rust 命令

// 重新导出
pub use websocket::WebSocketState;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .plugin(tauri_plugin_opener::init())
        .plugin(tauri_plugin_dialog::init())
        .plugin(tauri_plugin_fs::init())
        .plugin(tauri_plugin_notification::init())
        .plugin(tauri_plugin_updater::Builder::new().build())
        .manage(Arc::new(Mutex::new(WebSocketState::default())))
        .invoke_handler(tauri::generate_handler![
            // WebSocket 命令
            websocket::connect_websocket,
            websocket::disconnect_websocket,
            websocket::send_websocket_message,
            websocket::get_websocket_status,
            // 存储命令
            storage::secure_store_set,
            storage::secure_store_get,
            storage::secure_store_remove,
            storage::clear_all_cache,
            // 图片缓存命令
            storage::get_cached_image_path,
            storage::get_cached_image_data,
            storage::cache_image,
            storage::clear_image_cache,
            // 聊天记录命令
            chat::clear_all_chat_messages,
            chat::clear_user_chat_messages,
            chat::clear_group_chat_messages,
            // 群组命令
            group::cache_user_groups,
            group::get_cached_user_groups,
            group::cache_group_members,
            group::get_cached_group_members,
            group::add_group_member_to_cache,
            group::remove_group_member_from_cache,
            group::clear_groups_cache,
            group::clear_group_members_cache
        ])
        .setup(|_app| {
            // 应用启动时的初始化
            eprintln!("Tauri 应用启动");
            Ok(())
        })
        .on_window_event(|_window, event| {
            // 监听窗口关闭事件
            if let tauri::WindowEvent::CloseRequested { .. } = event {
                eprintln!("窗口关闭请求，准备清理资源");
                // 注意：这里不能直接调用异步函数，但可以发送信号
                // 实际的清理会在 WebSocket 断开时自动触发
            }
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
